package adapters

import (
	"ai-gateway/common"
	"ai-gateway/db"
	"ai-gateway/proto"
	"bytes"
	"context"
	"encoding/json"
	"fmt"
	"net/http"

	"google.golang.org/grpc/metadata"
)

type BaiduAdapter struct{}

// 固定百度模型
const baiduFixedModel = "ernie-bot"

// 百度API响应结构（简化版，仅保留必要字段）
type baiduAPIResponse struct {
	ID      string `json:"id"`
	Object  string `json:"object"`
	Created int64  `json:"created"`
	Result  string `json:"result"`
	Usage   struct {
		PromptTokens     int `json:"prompt_tokens"`
		CompletionTokens int `json:"completion_tokens"`
		TotalTokens      int `json:"total_tokens"`
	} `json:"usage"`
}

func (a *BaiduAdapter) Call(ctx context.Context, req *proto.AIRequest) (*proto.AIResponse, error) {
	// 获取元数据中的场景信息
	md, ok := metadata.FromIncomingContext(ctx)
	if !ok {
		return &proto.AIResponse{}, fmt.Errorf("元数据获取失败")
	}
	scenario := md.Get("scenario")[0]

	// 查询百度API配置（密钥、地址、单价）
	var config struct {
		ApiKey     string  `db:"api_key"`
		ApiUrl     string  `db:"api_url"`
		TokenPrice float64 `db:"token_price"`
	}
	err := db.DB.Get(&config, "SELECT api_key, api_url, token_price FROM provider_configs WHERE provider = ?", "baidu")
	if err != nil {
		return &proto.AIResponse{Result: "获取百度配置失败"}, err
	}

	// 构造百度API请求体
	requestBody := map[string]interface{}{
		"model": baiduFixedModel, // 固定模型
		"messages": []map[string]string{
			{"role": "user", "content": req.Prompt}, // 用户输入
		},
	}
	bodyBytes, err := json.Marshal(requestBody)
	if err != nil {
		return &proto.AIResponse{}, fmt.Errorf("请求体序列化失败: %v", err)
	}

	// 发起HTTP POST请求到百度API
	httpReq, err := http.NewRequestWithContext(ctx, "POST", config.ApiUrl, bytes.NewBuffer(bodyBytes))
	if err != nil {
		return &proto.AIResponse{}, fmt.Errorf("创建HTTP请求失败: %v", err)
	}
	// 设置百度API要求的鉴权头（AK/SK方式，具体看百度文档）
	httpReq.Header.Set("Content-Type", "application/json")
	httpReq.Header.Set("Authorization", "Bearer "+config.ApiKey) // 假设ApiKey是完整的token，实际可能需要AK/SK签名

	// 执行请求并获取响应
	client := &http.Client{}
	httpResp, err := client.Do(httpReq)
	if err != nil {
		return &proto.AIResponse{}, fmt.Errorf("百度API调用失败: %v", err)
	}
	defer httpResp.Body.Close()

	// 解析百度API响应
	var apiResp baiduAPIResponse
	if err := json.NewDecoder(httpResp.Body).Decode(&apiResp); err != nil {
		return &proto.AIResponse{}, fmt.Errorf("响应解析失败: %v", err)
	}
	if httpResp.StatusCode != http.StatusOK {
		return &proto.AIResponse{}, fmt.Errorf("百度API返回错误状态: %d, 结果: %s", httpResp.StatusCode, apiResp.Result)
	}

	// 计算成本
	totalTokens := apiResp.Usage.TotalTokens
	cost := int64(float64(totalTokens) * config.TokenPrice * 100)

	// 日志记录与结果返回
	common.Logger.Info().
		Str("provider", "baidu").
		Str("model", baiduFixedModel).
		Str("scenario", scenario).
		Int("token_used", totalTokens).
		Msg("百度API调用成功")

	return &proto.AIResponse{
		Result:    apiResp.Result, // 百度返回的实际结果
		Provider:  "baidu",
		TokenUsed: int32(totalTokens),
		Cost:      cost,
	}, nil
}

func init() {
	RegisterAdapter("baidu", &BaiduAdapter{})
}
